package cn.wolfcode.web.advice;


import cn.wolfcode.domain.JsonResult;
import cn.wolfcode.domain.LoginException;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletResponse;

/**
 *  统一 异常处理
 */
// 贴注解
@ControllerAdvice
public class ExceptionControllerAdvice {
    // 处理异常的方法，跟我们之前处理请求的方法很相似
    // 前者贴 @ExceptionHandler 针对处理异常; 后者贴 @RequestMapper 针对什么资源路径
    // 前者没有接受请求参数的形参，可以有 Model、Servlet、异常形参、HandlerMethod(处理方法)


    // @ExceptionHandler(XxxException.class)  // 针对处理指定的某种异常

    //  ====== 不响应给浏览器 ========
/*    @ExceptionHandler(RuntimeException.class)   // 针对处理方法异常
    public void e1(RuntimeException e, HandlerMethod method){
        e.printStackTrace();  // 注意在开发的时候这个方法开启来，查看异常信息
    }*/

    // ====== 响应 html ==========
/*    @ExceptionHandler(RuntimeException.class)
        public ModelAndView e2(RuntimeException e){
            e.getStackTrace();
        ModelAndView view = new ModelAndView("/error/error");  // 显示页面在 templates
        return view;
        }*/

    // ==== 响应 html =========
    @ExceptionHandler(RuntimeException.class)
    public String e2(RuntimeException e, Model model){
        e.getStackTrace();
        model.addAttribute("errorMsg", "出错啦");
        //return "redirect:/static/error/error.html"; // 页面放在static时需要重定向
        return "common/error";// 页面放 templates(模板) 时有视图
    }

    // ====== 响应JSON ============
/*    @ResponseBody
    @ExceptionHandler(LoginException.class)
    public JsonResult e4(LoginException e){
        System.out.println("msg");
        return new JsonResult(false, e.getMessage());
    }*/
}
